home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / telecomm / sticpsrc.lzh / SOURCE.ARC / ICMPSUBR.C < prev    next >
C/C++ Source or Header  |  1990-03-13  |  1KB  |  54 lines

  1. /* Low-level routines for ICMP */
  2. #include "global.h"
  3. #include "mbuf.h"
  4. #include "internet.h"
  5. #include "icmp.h"
  6.  
  7. /* Generate ICMP header in network byte order, link data, compute checksum */
  8. struct mbuf *
  9. htonicmp(icmp,data)
  10. struct icmp *icmp;
  11. struct mbuf *data;
  12. {
  13.     struct mbuf *bp;
  14.     register char *cp;
  15.     int16 checksum;
  16.  
  17.     if((bp = pushdown(data,ICMPLEN)) == NULLBUF)
  18.         return NULLBUF;
  19.     cp = bp->data;
  20.  
  21.     *cp++ = icmp->type;
  22.     *cp++ = icmp->code;
  23.     cp = put16(cp,0);        /* Clear checksum */
  24.     cp = put16(cp,icmp->args.echo.id);
  25.     cp = put16(cp,icmp->args.echo.seq);
  26.  
  27.     /* Compute checksum, and stash result */
  28.     checksum = cksum(NULLHEADER,bp,len_mbuf(bp));
  29.     cp = &bp->data[2];
  30.     cp = put16(cp,checksum);
  31.  
  32.     return bp;
  33. }
  34. /* Pull off ICMP header */
  35. int
  36. ntohicmp(icmp,bpp)
  37. struct icmp *icmp;
  38. struct mbuf **bpp;
  39. {
  40.     char icmphead[8];
  41.  
  42. #ifdef DEBUG
  43.     if(icmp == (struct icmp *)NULL)
  44.         return -1;
  45. #endif
  46.  
  47.     pullup(bpp,icmphead,8);
  48.     icmp->type = icmphead[0];
  49.     icmp->code = icmphead[1];
  50.     icmp->args.echo.id = get16(icmphead + 4);
  51.     icmp->args.echo.seq = get16(icmphead + 6);
  52.     return 0;
  53. }
  54.